import type { Router } from 'vue-router'
import { useUserStore } from '@/stores/user'

const whiteList = ['/login'] // 不需要登录拦截的白名单

// 标记是否正在加载用户信息，避免重复请求
let isLoadingUserInfo = false
// 待处理的导航队列
interface NavigationContext {
  to: any
  from: any
  next: Function
}
let pendingNavigations: NavigationContext[] = []

export function setupRouterGuard(router: Router) {
  // 从beforeEach中获取userStore，确保在Pinia初始化后使用
  
  router.beforeEach(async (to, from, next) => {
    // 在路由守卫中获取userStore，确保Pinia已初始化
    const userStore = useUserStore()
    
    // 如果是首次导航，初始化用户状态
    if (!userStore._initialized) {
      userStore.initUserState()
      userStore._initialized = true
    }
    
    // 检查是否在白名单中
    if (whiteList.includes(to.path)) {
      next()
      return
    }
    
    // 检查用户是否已登录
    if (!userStore.isLoggedIn) {
      // 未登录，重定向到登录页面，并记录目标页面以便登录后跳转
      next({ path: '/login', query: { redirect: to.fullPath } })
      return
    }
    
    // 已登录但用户信息丢失，需要重新加载用户信息
    if (userStore.isLoggedIn && !userStore.user) {
      // 如果正在加载中，将当前导航加入队列
      if (isLoadingUserInfo) {
        pendingNavigations.push({ to, from, next })
        return
      }
      
      try {
        isLoadingUserInfo = true
        await userStore.fetchUserInfo()
        
        // 加载成功，检查用户信息是否存在
        if (userStore.user) {
          next()
        } else {
          // 加载失败，调用退出登录方法清除状态
          console.error('用户信息为空，清除登录状态')
          userStore.logout()
          next({ path: '/login', query: { redirect: to.fullPath } })
        }
      } catch (error) {
        console.error('加载用户信息失败:', error)
        // 注意：fetchUserInfo内部已经调用了logout方法
        // 获取用户信息失败，跳转到登录页面
        next({ path: '/login', query: { redirect: to.fullPath } })
      } finally {
        isLoadingUserInfo = false
        // 处理队列中的导航请求
        while (pendingNavigations.length > 0) {
          const { to: pendingTo, next: pendingNext } = pendingNavigations.shift() as any
          if (userStore.user) {
            pendingNext()
          } else {
            pendingNext({ path: '/login', query: { redirect: pendingTo?.fullPath } })
          }
        }
      }
      return
    }
    
    // 已登录且用户信息完整，允许访问
    next()
  })
  
  router.afterEach((to) => {
    // 可以在这里添加页面访问统计等逻辑
    console.log('路由跳转:', to.path)
  })
  
  return router
}